﻿/**
* Класс последовательно загружает в горизонтальную/вертикальную ленту фотографии
* @author Firsoff Maxim, ICQ:235859730, email: firsoff_maxim@mail.ru
* @version 0.1/16.02.2008 19:07
*/
package ru.vega_int.firsoff.as3.tape 
{
	// IMPORT
	import classes.Main;
	import flash.display.Sprite;
	import flash.errors.IllegalOperationError;
	import ru.vega_int.firsoff.as3.events.*;
	import flash.events.ProgressEvent;
	import flash.events.Event;
	
	public class Tape extends Sprite
	{
		
		//	PROPERTIES
		private var _type:String;						//	тип ленты
		private var content:Array;						//	контент для ленты
		private var _width:Number;						//	ширина для ленты
		private var _height:Number;						//	высота для ленты
		private var _align:String;						//	выравнивание (LEFT/RIGHT)
		private var totalFiles:uint;					//	общее колво файлов
		private var _loadedFiles:uint;					//	колво загруженных файлов
		private var _delimiterThickness:Number;			//	толщина разделителя
		//private var 
		private var backGroundStyle:Object;				//	стиль фона
		private var initObj:Object;						//	объект настройки
		private var _reverse:Boolean;					//	реверсивная загрузка
		
		public var lastLoaded:TapeContainer;	
		public var containers:Array;					//	массив контейнеров
		public static const LOAD_COMPLETE:String = Event.INIT;	//	событие полной загрузки
		public static const LOAD_IMAGE:String = 'image_load';	//	событие загрузки 1 изображения
		//--------------------------------------------------------------------------
		
		//	CONSTRUCTOR
		
		/**
		 * Конструктор
		 * @param	content		Массив контента
		 * @param	width		Ширина ленты (необходимо для вертикального типа)
		 * @param	height		Высота (для горизонтального типа)
		 * @param	type		Тип ленты
		 */
		public function Tape(content:Array, _width:Number, _height:Number, type:String='horizontal', initObj:Object=null, align:String='left', backGroundStyle:Object=null) 
		{
			this.content = content;
			this._width = _width;
			this._height = _height;
			this.initObj = initObj;
			this._align = align;
			if(backGroundStyle)
			{
				this.backGroundStyle = backGroundStyle;
			}
			else{this.backGroundStyle = {color:0x040404, alpha:0};};
			if(type != 'horizontal' && type != 'vertical'){throw new IllegalOperationError('please set correct type of Tape (horizontal or vertical)');}
			else 
			{
				this._type = type;
			};
			init();
		};
		
		//	METHODS
		//	private 
		private function init() :void
		{
			_delimiterThickness = 0;
			containers = new Array();
			_reverse = false;
			//this.mouseEnabled = true;
			totalFiles = content.length;
			_loadedFiles = 0;
		};
		
		/**
		 * Создает ленту:
		 * 1. сначала создаются контейнеры пустышки
		 */
		private function createContainers():void
		{
			var cWidth:Number = _width;
			var cHeight:Number = _height;
			var bgdWidth:Number;
			var bgdHeight:Number = _height;
			if(_type == 'horizontal'){cWidth = 10*cHeight;}
			else {cHeight = 10*cWidth;};
			for (var i:int = 0; i < content.length; i++) 
			{
				//trace(content[i].url)
				var c:TapeContainer = new TapeContainer(cWidth, cHeight, initObj);
				
				try 
				{
					if(content[i].width){bgdWidth = content[i].width;}
					else{bgdWidth = Math.min(cWidth, cHeight);};
				}
				catch (e:Error)
				{
					bgdWidth = Math.min(cWidth, cHeight);			
				};

				c.setBackground(backGroundStyle.color, backGroundStyle.alpha, bgdWidth, bgdHeight);
				addChild(c);
				if(!_reverse)
				{
					c.load(content[i].url, i);
					setHandlers(c);
				};
				containers.push(c);
				
				if(i)
				{
					if(_align == 'left')
					{
						c.x = containers[i - 1].x + containers[i - 1].width + _delimiterThickness;
					}
					else 
					{
						c.x = containers[i - 1].x - containers[i].width - _delimiterThickness;
					};
				}
				else 
				{
					if(_align != 'left')
					{
						c.x = - c.width;
					}
				};
			};
			
			if(_reverse)
			{
				/*for (var i:int = 0; i < content.length; i++) 
				{
					c.load(content[i].url, i);
					setHandlers(c);
				};*/
				for (var k:int = content.length - 1; k >= 0; k--) 
				{
					//trace(content[k].url)
					var url:String = content[k].url;
					var cont:TapeContainer = containers[k];
					cont.load(url, k);
					setHandlers(cont);
				}
			};
			//trace(this.width);
			//this.x = -300;
		};
		
		/**
		 * Добавляем обработчики к каждому контейнеру
		 * @param	c
		 */
		private function setHandlers(c:TapeContainer):void
		{
			c.addEventListener(ImageViewerEvent.ON_INIT, handlerLoad);
			c.addEventListener(ImageViewerEvent.ON_ERROR, handlerError);
			c.addEventListener(ProgressEvent.PROGRESS, handlerProgress);
		};
		
		/**
		 * Удаление обработчиков
		 * @param	c
		 */
		private function removeHandlers(c:TapeContainer):void
		{
			c.removeEventListener(ImageViewerEvent.ON_INIT, handlerLoad);
			c.removeEventListener(ImageViewerEvent.ON_ERROR, handlerError);
			c.removeEventListener(ProgressEvent.PROGRESS, handlerProgress);
		};
		
		private function deleteContainer(c:TapeContainer):Boolean
		{
			var ret:Boolean = false;
			for (var i:int = 0; i < containers.length; i++) 
			{
				if(containers[i] == c)
				{
					containers.splice(i, 1);
					ret = true;
					break;
					
				};
			};
			return ret;
		};
		
		//	распределение
		private function allocate():void
		{
			for (var i:int = 0; i < containers.length; i++) 
			{
				if(_align == 'left')
				{
					if(i)
					{
						//trace(containers[i-1].containerWidth, containers[i-1].width)
						containers[i].x = containers[i-1].x + containers[i-1].containerWidth + _delimiterThickness;
					};
				}
				else 
				{
					if(i)
					{
						containers.x = containers[i - 1].x - containers[i].width - _delimiterThickness; 
					}
					else 
					{
						containers[i].x = -containers[i].width;
					};
					
				};
			};
		};
		
		//	public
		public function load(reverse:Boolean=false):void
		{
			_reverse = reverse;
			createContainers();
		};
		
		public function destroy() :void
		{
			for(var i in containers)
			{
				removeHandlers(containers[i]);
				containers[i].destroy;
				removeChild(containers[i]);
			};
		};
		//--------------------------------------------------------------------------
		
		//	GETTERS/SETTERS
		public function set delimiterThickness(value:Number):void
		{
			this._delimiterThickness = value;
		};
		
		public function get delimiterThickness():Number
		{
			return this._delimiterThickness;
		};
		
		public function get loadedFiles() :uint
		{
			return _loadedFiles;
		};
		//--------------------------------------------------------------------------
		
		//	HANDLERS
		/**
		 * Обработчик загрузки одной фотографии
		 * @param	e
		 */
		private function  handlerLoad(e:Event):void 
		{
			_loadedFiles++;
			allocate();
			lastLoaded = TapeContainer(e.target);
			this.dispatchEvent(new Event(LOAD_IMAGE));
			//trace(e.target.width);
			if(_loadedFiles == totalFiles)
			{
				//	после того как все файлы загрузились, выбрасываем событие инициализации
				
				this.dispatchEvent(new Event(LOAD_COMPLETE));
			};
			
		};
		
		private function  handlerError(e:Event):void 
		{
			_loadedFiles++;
			var c:TapeContainer = TapeContainer(e.target);
			removeHandlers(c);
			deleteContainer(c);
			c.destroy();
			this.removeChild(c);
			allocate();
			if(_loadedFiles == totalFiles)
			{
				//	после того как все файлы загрузились, выбрасываем событие инициализации
				this.dispatchEvent(new Event(LOAD_COMPLETE));
			};
			
		};
		
		private function  handlerProgress(e:ProgressEvent):void 
		{
					
		};
		//--------------------------------------------------------------------------
		
	};
	
};
